package com.steak.DIP.logger;

/**
 * 功能说明： 日志接口，为什么要单独提出一个日志接口来？
 *          遵循依赖倒置原则，在引入其他日志框架时，都必须面向这个接口进行编程，
 *          因为每种日志框架的设计有异同，使用API可能不一样，这样，如果一个项目
 *          中引入多个日志框架，那么代码就会变得混乱，所以应该制定一个顶层规约，
 *          它屏蔽了各种日志框架的实现和使用方式，从而实现统一的管理
 * <p>
 * Original @Author: steakliu-刘牌, 2022-08-10  11:17
 * <p>
 * Copyright (C)2020-2022  steakliu All rights reserved.
 */
public interface Logger {

    public void debug(String msg);

    /**
     * Log a message at the DEBUG level. support format.
     *
     * @param msg
     * @param args
     */
    default public void debug(String msg, Object... args){
        debug(String.format(msg, args));
    }

    /**
     * Log a message at the INFO level.
     *
     * @param msg the message string to be logged
     */
    public void info(String msg);

    /**
     * Log a message at the INFO level. support format.
     *
     * @param msg
     * @param args
     */
    default public void info(String msg, Object... args){
        info(String.format(msg, args));
    }

    /**
     * Log a message at the WARN level.
     *
     * @param msg the message string to be logged
     */
    public void warn(String msg);

    /**
     * Log a message at the WARN level. support format.
     *
     * @param msg
     * @param args
     */
    default public void warn(String msg, Object... args){
        warn(String.format(msg, args));
    }
    /**
     * Log a message at the ERROR level.
     *
     * @param msg the message string to be logged
     */
    public void error(String msg);

    /**
     * Log a message at the ERROR level. support format.
     * @param msg
     * @param args
     */
    default public void error(String msg, Object... args){
        error(String.format(msg, args));
    }

    /**
     * Log an exception (throwable) at the ERROR level with an
     * accompanying message.
     *
     * @param msg the message accompanying the exception
     * @param t   the exception (throwable) to log
     */
    public void error(String msg, Throwable t);
}
